package com.higgins.eventtracking.client;

import java.util.Date;
import java.util.List;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.higgins.eventtracking.client.dto.BodyStatsDTO;
import com.higgins.eventtracking.client.dto.ChartDataDTO;
import com.higgins.eventtracking.client.dto.FinanceStatsDTO;
import com.higgins.eventtracking.client.dto.GoalDTO;
import com.higgins.eventtracking.client.dto.HealthAlertDTO;
import com.higgins.eventtracking.client.dto.HealthEventDTO;
import com.higgins.eventtracking.client.dto.HealthStatsDTO;
import com.higgins.eventtracking.client.dto.RuleDTO;
import com.higgins.eventtracking.client.dto.SupportDTO;
import com.higgins.eventtracking.client.dto.TimeTableTaskDTO;
import com.higgins.eventtracking.client.dto.TrackingEventDTO;
import com.higgins.eventtracking.client.dto.TransactionDTO;
import com.higgins.eventtracking.client.dto.WeightEventDTO;

/**
 * The async counterpart of <code>GreetingService</code>.
 */
public interface EventTrackingServiceAsync {
	void getDayOfYearNumber(Date date, AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void getWeekNumber(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void insertTrackingEvent(TrackingEventDTO input, AsyncCallback<String> callback) throws IllegalArgumentException;
	void retrieveTrackingEvent(String eventType, AsyncCallback<TrackingEventDTO> callback) throws IllegalArgumentException;	
	void insertTransaction(TransactionDTO dto, AsyncCallback<String> callback) throws IllegalArgumentException;
//	void retrieveFinanceStats(AsyncCallback<FinanceStatsDTO> callback) throws IllegalArgumentException;
	void insertHealthEvent(HealthEventDTO dto, AsyncCallback<String> callback) throws IllegalArgumentException;
	void insertBodyEvent(BodyStatsDTO dto, AsyncCallback<String> callback) throws IllegalArgumentException;
	void retrieveHealthStats(AsyncCallback<HealthStatsDTO> callback) throws IllegalArgumentException;
	void retrieveHealthStats(Date start, Date end, AsyncCallback<List<HealthStatsDTO>> callback) throws IllegalArgumentException;
//	void retrieveFinanceChartData(Boolean weeklyChart, AsyncCallback<ChartDataDTO> callback)	throws IllegalArgumentException;
	void retrieveExerciseChartData(String exercise, AsyncCallback<List<Double>> callback)	throws IllegalArgumentException;
	void retrieveExerciseChartDataDTO(String exercise, AsyncCallback<List<TrackingEventDTO>> callback)	throws IllegalArgumentException;
	void retrieveWeightEventChartDataDTO(String type, AsyncCallback<List<WeightEventDTO>> callback) throws IllegalArgumentException;
	void retrieveWeightChartData(String exercise, Boolean monthlyOrWeekly, AsyncCallback<List<Double>> callback)	throws IllegalArgumentException;
	void retrieveDaysSinceExercise(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveDaysSinceLowFrameOfMind(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveDaysSinceLowWellBeing(AsyncCallback<Integer> callback) throws IllegalArgumentException;
    void getWellBeing(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveDaysSinceLowEnergy(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveDaysSinceSleep(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveDaysSinceDump(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveDaysSinceStretch(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveHoursSinceBrushTeeth(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveHoursSinceWater(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveDaysSinceSalad(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveDaysSinceVeg(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveDaysSinceFruit(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveDaysSinceRoughage(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveHoursSinceFood(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveFirstEaten(AsyncCallback<String> callback) throws IllegalArgumentException;
	void retrieveDaysSinceBloated(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveDaysSinceBisacodyl(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveNumberOfBrushesToday(AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveAchievements(AsyncCallback<List<String>> callback) throws IllegalArgumentException;
	void retrieveAchievements(String frameOfMind, Integer weekNumber, AsyncCallback<List<String>> callback) throws IllegalArgumentException;
	void retrieveAchievements(Date startDate, Date endDate, String intensity, String frameOfMind, AsyncCallback<List<String>> callback) throws IllegalArgumentException;
	void insertFrameOfMind(String frameOfMind, AsyncCallback<Boolean> callback) throws IllegalArgumentException;
	void frameOfMindSetToday(AsyncCallback<Boolean> callback) throws IllegalArgumentException;	
	void healthEventToday(String healthEventType, AsyncCallback<Boolean> callback) throws IllegalArgumentException;
	void weightEventToday(String weightEventType, AsyncCallback<Boolean> callback) throws IllegalArgumentException;
	void insertWeightEvent(WeightEventDTO weightEvent, AsyncCallback<String> callback) throws IllegalArgumentException;
	void retrieveDaysSinceFrameOfMind(String frameOfMind, AsyncCallback<Integer> callback) throws IllegalArgumentException;
	void retrieveHealthAlerts(AsyncCallback<List<HealthAlertDTO>> callback) throws IllegalArgumentException;
	void retrieveHealthAlerts(String tabTitle, AsyncCallback<List<HealthAlertDTO>> callback) throws IllegalArgumentException;
	void updateHealthAlert(HealthAlertDTO dto, AsyncCallback<String> callback) throws IllegalArgumentException;
	void retrieveTimeTableTasks(Date now, AsyncCallback<List<TimeTableTaskDTO>> callback) throws IllegalArgumentException;
	void retrieveTimeTableTasks(Boolean yearly, Boolean monthly, Boolean weekly, Boolean Daily, Boolean holidays, Date now, AsyncCallback<List<TimeTableTaskDTO>> callback) throws IllegalArgumentException;
	void retrieveTimeTableFuel(Boolean yearly, Boolean monthly, Boolean weekly, Boolean Daily, Boolean holidays, Date now, AsyncCallback<List<TimeTableTaskDTO>> callback) throws IllegalArgumentException;
	void updateTimeTableTask(TimeTableTaskDTO dto, AsyncCallback<String> callback) throws IllegalArgumentException;
	void retrieveGoals(String frameOfMind, AsyncCallback<List<GoalDTO>> callback) throws IllegalArgumentException;
	void updateGoal(GoalDTO dto, AsyncCallback<String> callback) throws IllegalArgumentException;
	void retrieveHealthEvents(String event, AsyncCallback<List<HealthEventDTO>> callback) throws IllegalArgumentException;
	void retrieveHealthEvents(String event, String eventTwo, AsyncCallback<List<HealthEventDTO>> callback) throws IllegalArgumentException;
	void deleteGoal(Long id, AsyncCallback<Long> callback) throws IllegalArgumentException;
	void completeGoal(GoalDTO dto, AsyncCallback<String> callback) throws IllegalArgumentException;
	void retrieveSupport(AsyncCallback<List<SupportDTO>> callback) throws IllegalArgumentException;
	void updateSupport(SupportDTO dto, AsyncCallback<String> callback) throws IllegalArgumentException;
	void deleteSupport(Long id, AsyncCallback<Long> callback) throws IllegalArgumentException;
	void retrievePeriodSinceAlert(HealthAlertDTO dto, AsyncCallback<HealthAlertDTO> callback) throws IllegalArgumentException;
    void retrieveRules(String parentDynamicType, String frameOfMind, AsyncCallback<List<RuleDTO>> callback) throws IllegalArgumentException;
    void retrieveRules(String parentDynamicType, String frameOfMind, Date startDate, Date endDate, AsyncCallback<List<RuleDTO>> callback) throws IllegalArgumentException;
	void updateRule(RuleDTO goal, AsyncCallback<String> callback) throws IllegalArgumentException;
	void deleteRule(Long id, AsyncCallback<Long> callback) throws IllegalArgumentException;
	void retrieveRecommendedFrameOfMind(AsyncCallback<String> callback) throws IllegalArgumentException;
	void retrieveMaxWeightThisWeek(String exercise, AsyncCallback<Double> callback) throws IllegalArgumentException; 
	void retrieveMaxDistanceThisWeek(String exercise, AsyncCallback<Double> callback) throws IllegalArgumentException; 
	
}
